package main

import (
	"sync"
	"time"
)

// 连接池需要考虑以下几个问题：

// 1、连接池的链接数据是否有限制，可以最大简历多少个链接
// 2、当连接没有使用，需要回收该链接么？
// 3、业务请求需要获取链接时，业务需要排队等待么
// 4、排队的话有存在另外的问题，队列长度有误限制， 排队的时间呢？

type Transport struct {
	// 操作空闲链接需要获取锁
	idleMu sync.Mutex
	// 空闲连接池，key 为协议的目标地址等组合
	idleConn map[connectMethodKey][]*persistConn
	// 等待空闲链接的队列，基于切片实现，队列大小无限制
	idleConnWait map[connectMethodKey]wantConnQueue

	// 排队等待简历链接需要获取锁
	connsPerhostMu sync.Mutex
	// 每个 host 建立的链接数
	connsPerHost map[connectMethodKey]int
	// 等待建立链接的队列， 同样基于切片实现，队列大小无限制
	connsPerHostWait map[connectMethodKey]wantConnQueue

	// 最大空闲连接数，
	MaxIdleConns int
	// 每个目标 host 最大空闲连接数，默认为 2
	MaxIdleConnsPerHost int
	// 每个 host 可以建立的最大链接数
	MaxConnsPerHost int
	// 链接多少时间没有使用，则呗关闭
	IdleConnTimeout time.Duration

	// 禁止使用长连接。使用短连接
	DisableKeepAlives bool
}
